package com.ccnu.JobHub.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.ccnu.JobHub.common.util.Token;
import com.ccnu.JobHub.model.common.Result;
import com.ccnu.JobHub.model.database.Feedback;
import com.ccnu.JobHub.model.request.PostFeedback;
import com.ccnu.JobHub.model.request.PutFeedback;
import com.ccnu.JobHub.service.impl.EmailService;
import com.ccnu.JobHub.service.impl.FeedbackService;
import com.ccnu.JobHub.service.impl.StudentService;
import jakarta.mail.MessagingException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

@RestController
@RequestMapping("")
@CrossOrigin("*")
@Slf4j
public class FeedbackController {
    private final FeedbackService feedbackService;
    private final StudentService studentService;
    private final EmailService emailService;

    /**
     * 构造函数
     * @param feedbackService 反馈服务
     * @param studentService 学生服务
     */
    public FeedbackController(FeedbackService feedbackService, StudentService studentService, EmailService emailService) {
        this.feedbackService = feedbackService;
        this.studentService = studentService;
        this.emailService = emailService;
    }

    /**
     * 发出反馈信息
     * @param token 用户的token令牌
     * @param postFeedback 包含反馈的内容
     * @return 返回一个这次创建的反馈内容
     */
    @PostMapping("feedbacks")
    public Result feedbacks(@RequestHeader("token") String token, @RequestBody PostFeedback postFeedback){
        log.info("--------------------发出反馈请求--------------------");
        String studentId = Token.inspectOldToken(token);
        LocalDateTime currentTime = LocalDateTime.now().minusNanos(LocalDateTime.now().getNano());
        System.out.println(currentTime);
        // 设置反馈的内容
        Feedback feedback = new Feedback();
        feedback.setContent(postFeedback.getContent());
        feedback.setCreatedAt(currentTime);
        feedback.setStudentId(Integer.valueOf(studentId));
        feedback.setStatus(0);
        // 保存进数据库
        try {
            feedbackService.save(feedback);
        } catch (Exception e) {
            log.error(e.getMessage());
            return Result.error("发出反馈失败");
        }
        return Result.success("成功发出反馈",feedback);
    }

    /**
     * 查看反馈列表
     * @param page 当前页码
     * @param pageSize 页面大小
     * @return 一些反馈信息
     */
    @GetMapping("feedbacks")
    public Result feedbacks(@RequestParam("page") Integer page,@RequestParam("pageSize") Integer pageSize){
        log.info("--------------------查看反馈列表请求--------------------");
        QueryWrapper<Feedback> feedbackQueryWrapper = new QueryWrapper<Feedback>()
                .eq("status",0)
                .orderByAsc("created_at");
        Page<Feedback> page1 = Page.of(page,pageSize);
        List<Feedback> feedbacks = feedbackService.list(page1,feedbackQueryWrapper);
        if (feedbacks.isEmpty()){
            return Result.error("当前页面无反馈信息");
        }
        return Result.success("成功查看反馈列表",feedbacks);
    }

    /**
     * 处理用户反馈的更新请求
     * 此方法接收一个PutFeedback对象，其中包含反馈的详细信息，并尝试更新反馈的状态
     * 如果更新成功，将发送一封确认邮件给用户提供反馈
     *
     * @param putFeedback 包含反馈详细信息的PutFeedback对象
     * @return 返回一个Result对象，表示处理反馈的结果
     */
    @PutMapping("feedbacks")
    public Result feedbacks( @RequestBody PutFeedback putFeedback){
        // 记录处理反馈请求的开始
        log.info("--------------------处理反馈请求--------------------");

        // 根据反馈ID获取反馈对象
        Feedback feedback = feedbackService.getById(putFeedback.getFeedbackId());
        // 更新反馈状态为已解决
        feedback.setStatus(1);
        // 设置反馈解决时间为当前时间，精确到秒
        LocalDateTime currentTime = LocalDateTime.now().minusNanos(LocalDateTime.now().getNano());
        feedback.setResolvedAt(currentTime);

        // 获取相关学生的邮箱地址
        String email = studentService.getById(feedback.getStudentId()).getEmail();

        // 尝试保存或更新反馈信息到数据库
        try {
            feedbackService.saveOrUpdate(feedback);
        } catch (Exception e) {
            // 如果数据库操作失败，记录错误并返回错误信息
            log.error(e.getMessage());
            return Result.error("数据库错误");
        }

        // 定义邮件内容的HTML模板
        String htmlContent = """
                <!DOCTYPE html>
                <html lang="zh">
                <head>
                    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
                    <style>
                        .email-card {
                            width: 100%;
                            max-width: 600px;
                            margin: auto;
                            border: 1px solid #ddd;
                            padding: 20px;
                            box-sizing: border-box;
                            font-family: Arial, sans-serif;
                        }
                        .email-card h3 {
                            font-size: 20px;
                            color: #333;
                            margin-bottom: 10px;
                        }
                        .email-card p {
                            font-size: 16px;
                            color: #666;
                            line-height: 1.5;
                        }
                    </style>
                </head>
                <body>
                    <div class="email-card">
                        <h3>启航站反馈回复</h3>
                        <p>亲爱的用户您好,</p>
                        <p>感谢您对启航站的关注和支持！我们已成功收到您的宝贵反馈，并正在积极采取措施解决问题。我们会尽快为您解决，并及时向您通报处理进度。</p>
                        <p>再次感谢您的理解与耐心等待，如有任何疑问或需要进一步的帮助，请随时联系我们。</p>
                        <p>启航站团队 敬上</p>
                    </div>
                </body>
                </html>
                """;

        // 尝试发送邮件给用户
        try {
            emailService.sendEmail(email,"反馈回复",htmlContent);
        } catch (MessagingException e) {
            // 如果邮件发送失败，记录错误并返回错误信息
            log.error(String.valueOf(e));
            return Result.error("发送反馈邮件失败");
        }

        // 如果一切顺利，返回成功信息
        return Result.success("处理反馈成功");
    }
}
